﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PandemiaAdmin.Entidades;
using System.IO;
using System.Xml.Serialization;
using Seguridad.Encriptación;

namespace PandemiaAdmin.Funcionalidad
{
    public class BLLServidor
    {
        private Encriptador _encriptador;

        public BLLServidor(string archivoServidores)
        {
            ArchivoServidores = archivoServidores;
            _encriptador = new Encriptador(Properties.Resources.PassPhrase, Properties.Resources.SaltValue, "MD5", 1, Properties.Resources.InitVector, 128);
        }

        public string ArchivoServidores { get; set; }


        public void CargarServidor(Servidor nuevoServidor)
        {
            List<Servidor> servidores = TraerServidores();

            if (servidores.Where(s => s.Nombre.ToLower().Equals(nuevoServidor.Nombre.ToLower())).Count() > 0)
                throw new Exception("Ya existe un servidor con el nombre " + nuevoServidor.Nombre);

            if (servidores.Count == 0)
                nuevoServidor.IdServidor = 1;
            else
                nuevoServidor.IdServidor = servidores.OrderByDescending(s => s.IdServidor).Select(s => s.IdServidor).FirstOrDefault() + 1;

            nuevoServidor.Clave = nuevoServidor.Clave;
            servidores.Add(nuevoServidor);
            GuardarServidores(servidores);
        }

        public void ModificarServidor(Servidor servidor)
        {
            List<Servidor> servidores = TraerServidores();
            Servidor servidorViejo = servidores.Where(s => s.IdServidor == servidor.IdServidor).FirstOrDefault();

            if (!servidor.Nombre.ToLower().Equals(servidorViejo.Nombre.ToLower()) && servidores.Where(s => s.Nombre.ToLower().Equals(servidor.Nombre.ToLower())).Count() > 0)
                throw new Exception("Ya existe un servidor con el nombre " + servidor.Nombre);

            servidorViejo.Nombre = servidor.Nombre;
            servidorViejo.UltimaConexion = servidor.UltimaConexion;
            servidorViejo.SoporteURL = servidor.SoporteURL;
            servidorViejo.Clave = servidor.Clave;

            GuardarServidores(servidores);
        }

        public void EliminarServidor(Servidor servidor)
        {
            List<Servidor> servidores = TraerServidores();
            Servidor servidorViejo = servidores.Where(s => s.IdServidor == servidor.IdServidor).FirstOrDefault();
            servidores.Remove(servidorViejo);

            GuardarServidores(servidores);
        }

        public List<Servidor> TraerServidores()
        {
            List<Servidor> servidores = new List<Servidor>();

            if (File.Exists(ArchivoServidores))
                using (StreamReader reader = new StreamReader(ArchivoServidores))
                {
                    XmlSerializer ser = new XmlSerializer(typeof(List<Servidor>));
                    servidores = ser.Deserialize(reader) as List<Servidor>;
                }

            foreach (Servidor servidor in servidores)
                servidor.Clave = _encriptador.Desencriptar(servidor.Clave);

            return servidores;
        }

        public Servidor TraerServidor(string nombre)
        {
            return TraerServidores().Where(s => s.Nombre.ToLower().Equals(nombre.ToLower())).FirstOrDefault();
        }

        public void GuardarServidores(List<Servidor> servidores)
        {
            using (StreamWriter writer = new StreamWriter(ArchivoServidores))
            {
                foreach (Servidor servidor in servidores)
                    servidor.Clave = _encriptador.Encriptar(servidor.Clave);

                XmlSerializer ser = new XmlSerializer(typeof(List<Servidor>));
                ser.Serialize(writer, servidores);
            }
        }
    }
}
